
#ifndef FUNCTIONS_H_
#define FUNCTIONS_H_

#include "VarArray.hpp"
#include "defs.hpp"
#include <Eigen/Dense>
#include <vector>

void ReadMeshASSCII(const std::string &meshFname, VarArray<Point, 2, 0> &grid);

void InitializeFlow(VarArray<Variable, 2, 0> &flow);
void InitializeFlow(VarArray<Eigen::Vector2d, 2, 0> &flow);

void CalcJacobianMatrix(VarArray<Variable, 2, 0> &flow, int column,
                        const VarArray<Point, 2, 0> &grid,
                        VarArray<Eigen::Matrix2d, 2, 0> &jacob_matrix,
                        const double re_num);

void CalcJacobianMatrix(const VarArray<Eigen::Vector2d, 2, 0> &flow, int column,
                        const VarArray<Point, 2, 0> &grid,
                        VarArray<Eigen::Matrix2d, 2, 0> &jacob_matrix,
                        const double re_num);

void CalcFXk(VarArray<Eigen::Vector2d, 2, 0> &flow, int column,
             const VarArray<Point, 2, 0> &grid, const double re_num,
             std::vector<Eigen::Vector2d> &fx_k);

void CalcResidual(const VarArray<Eigen::Matrix2d, 2, 0> &jacob_matrix,
                  const std::vector<Eigen::Vector2d> &fx_k,
                  std::vector<Eigen::Vector2d> &residual,const VarArray<Point, 2, 0> &grid);

void UpdateFlow(VarArray<Eigen::Vector2d, 2, 0> &flow,
                const std::vector<Eigen::Vector2d> &residual, int column);

double CalcNormal(const std::vector<Eigen::Vector2d> &residual);

void InitializeNextLine(VarArray<Eigen::Vector2d, 2, 0> &flow, int column);

void ThomasAlgorithm(VarArray<double, 2, 0> &coefficient_matrix, double *value,
                     int begin, int end);
#endif